package xfuzzy.xfhl.model.hierStruct;

/**
 * Clase que representa un nodo final, contiene un valor entero e implementa la
 * interfaz XfhlINode
 * 
 * @author Sergio Cala Cordero, Septiembre 2009, Herramienta XFHL
 * 
 */
public class XfhlNode extends XfhlAbstract implements XfhlINode, Comparable<XfhlNode> {

	/**
	 * Nos dice que el Nodo corresponde a una variable de entrada
	 */
	public static final int INPUT = 1;

	/**
	 * Nos dice que el Nodo corresponde a una variable interna
	 */
	public static final int INNER = 2;

	/**
	 * Nos dice que el Nodo corresponde a una variable de salida
	 */
	public static final int OUTPUT = 3;

	/**
	 * Valor del nodo
	 */
	private int valor;

	/**
	 * Nos dice el tipo de variable que es, INPUT, INNER, OUTPUT
	 */
	private int type;

	/**
	 * Constructor
	 * 
	 * @param valor
	 *            valor entero del nodo
	 */
	public XfhlNode(int valor, int type) {
		this.valor = valor;
		this.type = type;
	}

	/**
	 * Getter and setter
	 * 
	 * @return valor
	 */
	public int getValor() {
		return valor;
	}

	/**
	 * Metodo que copia el nodo actual, implementa la interfaz XfhlINodo
	 * 
	 * @return XfhlNodo copia
	 */
	public XfhlINode copiar() {
		return new XfhlNode(this.valor, this.type);
	}

	/**
	 * Metodo que imprime el valor del nodo, implementa la interfaz XfhlINodo
	 * 
	 */
	public void imprime() {

		String tipo;
		if (this.type == XfhlNode.INNER)
			tipo = "Inner  ";
		else if (this.type == XfhlNode.INPUT)
			tipo = "InPut  ";
		else
			tipo = "OutPut ";

		System.out.println(tipo + valor);
	}

	/**
	 * Metodo que nos permite copiar un XfhlNode o añadir un XfhlNode a un
	 * XfhlModule.
	 * 
	 * @param par
	 *            valor nos dice si estamos buscando un Modulo (0) o un Nodo (1)
	 *            MODULO (par=0): Copia un MODULO añadiendole un nuevo modulo
	 *            que es ent1 del modulo indicado, sus variables son sal= var+1,
	 *            ent2=var+2 y su id es idNuevoMod NODO (par=1): Copia un NODO
	 *            que va a convertirlo en modulo, donde sal es el valor del
	 *            Nodo, el idModulo es idNuevoMod, ent1 es var+1,ent2 es var+2.
	 * @param numMod
	 *            Numero de modulos del XfhlModule
	 * @param idNuevoMod
	 *            Identificador del nuevo modulo
	 */
	public XfhlINode copiar(int par, int numMod, int idNuevoMod) {

		// par sea 1 y ademas que coincida con el valor numMod
		if (par == 1 && numMod == this.valor && this.type == XfhlNode.INPUT) {
			// Nos creamos la variable interna
			XfhlNode nodeInner = new XfhlNode(idNuevoMod - 2, XfhlNode.INNER);
			// Nos creamos el nuevo nodo de entrada
			XfhlNode nodeInput = new XfhlNode(idNuevoMod, XfhlNode.INPUT);
			// This es un nodo INPUT
			return new XfhlModule(this, nodeInput, nodeInner, idNuevoMod);
		} 
		else
			return copiar();
	}
	
	public String getDescripcion()  {
		
		String descripcion = "";
		String tipo = "";
		if (type == INNER)
			tipo = "A";
		if (type == INPUT)
			tipo =  "I";
		if (type == OUTPUT)
			tipo = "O";
		descripcion = "[" + tipo + this.valor + "]";
		return descripcion;
	}

	public int compareTo(XfhlNode o) {
		final int BEFORE = -1;
	    final int EQUAL = 0;
	    final int AFTER = 1;
	    
	    if (this.type == o.type)  { 
	    	if (this.valor == o.valor)
	    		return EQUAL;
	    	if (this.valor > o.valor)
	    		return AFTER;
	    	else
	    		return BEFORE;
	    }
	    else  {
	    	return -1;
	    }
	}
}
